import { BblPrize } from "../entity/prize.entity";
import { AttachDto } from "./att.dto";
import { PrizeGroupListDto } from "./prize.group.dto";

/**
 * 奖品类型映射对象
 * 键为数据库存储的类型值，值为前端显示的文本
 */
export const PRIZE_TYPE_MAP = {
  1: "实物奖品",
  2: "虚拟奖品",
  3: "优惠券"
};

/**
 * 根据奖品类型值获取对应的显示文本
 * @param type 奖品类型数据库存储值（1-实物奖品，2-虚拟奖品，3-优惠券）
 * @returns 翻译后的奖品类型文本，未知类型返回格式化字符串
 */
export function getPrizeTypeText(type: number): string {
  return PRIZE_TYPE_MAP[type] || `未知类型(${type})`;
}

/**
 * 奖品添加传输对象
 * 用于前端向服务端传递创建奖品的必要信息
 */
export class PrizeCreateDto {
  /** 奖品名称，前端输入的奖品显示名称，必填字段 */
  prizeName: string;

  /** 奖品描述，对奖品的详细说明，支持富文本或纯文本 */
  prizeDesc: string;

  /** 奖品类型，数据库存储的数字类型（1-实物奖品，2-虚拟奖品，3-优惠券） */
  prizeType: number;

  /** 奖品总数量，初始可发放的奖品数量 */
  prizeQuantity: number;

  /** 奖品图片附件ID，关联附件表的主键，可选字段 */
  prizeImgId: string;

  /** 显示排序，数字越小越靠前，默认值为0 */
  sortOrder?: number;

  /** 权重，决定奖品在抽奖中的权重，默认值为0 */
  weight?: number;

  /** 奖品组ID，关联奖品组表的主键 */
  groupId?: string;
}

/**
 * 奖品列表查询传输对象
 * 用于前端向服务端传递奖品列表的筛选条件
 */
export class PrizeListQueryDto {
  /** 奖品名称（模糊查询），可选字段，支持部分字符串匹配 */
  prizeName?: string;

  /** 奖品类型（精确查询），可选字段，与数据库存储的类型值一致 */
  prizeType?: number;

  /** 奖品组ID（精确查询），可选字段，与奖品组表的主键一致 */
  groupId?: string;
}

/**
 * 奖品分页查询传输对象
 * 继承列表查询条件并添加分页参数
 */
export class PrizePageQueryDto {
  /** 奖品名称（模糊查询），可选字段 */
  prizeName?: string;

  /** 奖品类型（精确查询），可选字段 */
  prizeType?: number;

  /** 奖品组ID（精确查询），可选字段 */
  groupId?: string;

  /** 每页显示数量，字符串类型（前端传递时通常为字符串） */
  pageSize: string;

  /** 当前页码，字符串类型（前端传递时通常为字符串） */
  current: string;
}

/**
 * 奖品列表传输对象
 * 用于服务端向前端返回奖品列表的简化数据结构
 */
export class PrizeListDto {
  constructor(prize: BblPrize) {
    this.id = prize.id;
    this.prizeName = prize.prizeName;
    this.prizeType = prize.prizeType;
    this.prizeTypeText = getPrizeTypeText(prize.prizeType);
    this.prizeQuantity = prize.prizeQuantity;
    this.remainingQuantity = prize.remainingQuantity;
    this.sortOrder = prize.sortOrder;
    this.weight = prize.weight;
    this.isDeleted = prize.isDeleted;
    this.createdAt = prize.createdAt.valueOf();
    this.prizeImage = prize.prizeImage ? new AttachDto(prize.prizeImage) : null;
    this.prizeGroup = prize.prizeGroup
      ? new PrizeGroupListDto(prize.prizeGroup)
      : null;
  }

  /** 奖品主键ID，业务自定义的唯一标识符 */
  id: string;

  /** 奖品名称，与创建时输入的名称一致 */
  prizeName: string;

  /** 奖品类型（数字值），与数据库存储的类型一致 */
  prizeType: number;

  /** 奖品类型文本，根据类型值翻译后的显示文本 */
  prizeTypeText: string;

  /** 奖品总数量，创建时设置的可发放数量 */
  prizeQuantity: number;

  /** 剩余数量，当前可发放的奖品数量 */
  remainingQuantity: number;

  /** 显示排序，用于前端列表展示的顺序控制 */
  sortOrder: number;

  /** 权重，决定奖品在抽奖中的权重 */
  weight: number;

  /** 是否删除，软删除标志（0-未删除，1-已删除） */
  isDeleted: number;

  /** 创建时间戳，毫秒级时间戳便于前端处理 */
  createdAt: number;

  /** 奖品图片附件，包含图片的基本信息和访问地址 */
  prizeImage?: AttachDto;

  /** 奖品所属的奖品组信息 */
  prizeGroup?: PrizeGroupListDto;
}

/**
 * 奖品详情传输对象
 * 用于服务端向前端返回奖品的完整详细信息
 */
export class PrizeInfoDto {
  constructor(prize: BblPrize) {
    this.id = prize.id;
    this.prizeName = prize.prizeName;
    this.prizeDesc = prize.prizeDesc;
    this.prizeType = prize.prizeType;
    this.prizeTypeText = getPrizeTypeText(prize.prizeType);
    this.prizeQuantity = prize.prizeQuantity;
    this.remainingQuantity = prize.remainingQuantity;
    this.sortOrder = prize.sortOrder;
    this.weight = prize.weight ?? 0; // 新增：权重赋值
    this.isDeleted = prize.isDeleted;
    this.createdAt = prize.createdAt.valueOf();
    this.updatedAt = prize.updatedAt ? prize.updatedAt.valueOf() : 0;
    this.prizeImage = prize.prizeImage ? new AttachDto(prize.prizeImage) : null;
    this.prizeGroup = prize.prizeGroup
      ? new PrizeGroupListDto(prize.prizeGroup)
      : null;
    this.createdBy = prize.createdBy;
    this.updatedBy = prize.updatedBy;
  }

  /** 奖品主键ID */
  id: string;

  /** 奖品名称 */
  prizeName: string;

  /** 奖品描述 */
  prizeDesc: string;

  /** 奖品类型（数字值） */
  prizeType: number;

  /** 奖品类型文本 */
  prizeTypeText: string;

  /** 奖品总数量 */
  prizeQuantity: number;

  /** 剩余数量 */
  remainingQuantity: number;

  /** 显示排序 */
  sortOrder: number;

  /** 权重，决定奖品优先级，默认0 */
  weight: number;

  /** 是否删除（0-未删除，1-已删除） */
  isDeleted: number;

  /** 创建时间戳（毫秒） */
  createdAt: number;

  /** 更新时间戳（毫秒），未更新时为0 */
  updatedAt: number;

  /** 奖品图片附件 */
  prizeImage?: AttachDto;

  /** 奖品所属的奖品组信息 */
  prizeGroup?: PrizeGroupListDto;

  /** 创建人ID */
  createdBy: string;

  /** 更新人ID */
  updatedBy: string;
}

/**
 * 获取奖品类型列表（label-value格式）
 * @returns 包含所有奖品类型的数组，每个元素包含label和value字段
 */
export function getPrizeTypeOptions() {
  return Object.entries(PRIZE_TYPE_MAP).map(([value, label]) => ({
    value: Number(value),
    label
  }));
}

/**
 * 奖品更新传输对象
 * 用于前端向服务端传递更新奖品的必要信息
 */
export class PrizeUpdateDto {
  /** 奖品ID，需要更新的奖品唯一标识符 */
  id: string;

  /** 奖品名称，可选更新字段 */
  prizeName?: string;

  /** 奖品描述，可选更新字段 */
  prizeDesc?: string;

  /** 奖品类型，可选更新字段 */
  prizeType?: number;

  /** 奖品总数量，可选更新字段 */
  prizeQuantity?: number;

  /** 奖品图片附件ID，可选更新字段 */
  prizeImgId?: string;

  /** 显示排序，可选更新字段 */
  sortOrder?: number;

  /** 权重，可选更新字段 */
  weight?: number;

  /** 奖品组ID，可选更新字段 */
  groupId?: string;
}

/**
 * 奖品权重更新传输对象
 * 用于前端向服务端传递更新奖品权重的必要信息
 */
export class PrizeWeightUpdateDto {
  groupId: string;
  weight: Record<string, number>;
}
